package com.lanxin.qx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lanxin.qx.controller.QxRoleController;
import com.lanxin.qx.entity.QxRoleUser;
import com.lanxin.qx.mapper.QxRoleUserMapper;
import com.lanxin.qx.service.IQxRoleUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author author
 * @since 2025-08-19
 */
@Service
public class QxRoleUserServiceImpl extends ServiceImpl<QxRoleUserMapper, QxRoleUser> implements IQxRoleUserService {

    private static final Logger logger = Logger.getLogger(QxRoleUserServiceImpl.class);


    @Autowired
    private QxRoleUserMapper roleUserMapper;

    //根据角色id拿到下属员工
    @Override
    public List<Integer> getEmpByRoleId(Integer roleId) {
        return roleUserMapper.getEmpByRoleId(roleId);
    }

    // 保存角色与用户的关联（先删后增,避免一个用户拥有多个角色，导致报错）
    @Transactional  // 事务保证操作完整性
    @Override
    public boolean saveRoleUsers(Integer roleId, List<Integer> empIds) {
        logger.info("开始处理角色[" + roleId + "]的用户关联");

        // 1. 处理空参数情况
        if (empIds == null || empIds.isEmpty()) {
            logger.info("未选择用户，清空角色[" + roleId + "]的所有关联");
            // 清空当前角色的所有用户关联
            QueryWrapper<QxRoleUser> delQuery = new QueryWrapper<>();
            delQuery.eq("roleid", roleId);
            return this.remove(delQuery);
        }

        // 2. 先删除选中用户的所有旧角色关联（核心：确保用户只属于一个角色）
        logger.info("删除选中用户的原有角色关联，用户ID列表：" + empIds);
        for (Integer empId : empIds) {
            QueryWrapper<QxRoleUser> userDelQuery = new QueryWrapper<>();
            userDelQuery.eq("eid", empId); // 按用户ID删除所有角色关联
            this.remove(userDelQuery);
        }

        // 3. 清空当前角色的旧关联（避免重复数据）
        QueryWrapper<QxRoleUser> roleDelQuery = new QueryWrapper<>();
        roleDelQuery.eq("roleid", roleId);
        this.remove(roleDelQuery);

        // 4. 批量添加新的角色-用户关联
        logger.info("为角色[" + roleId + "]添加新用户关联，共" + empIds.size() + "个用户");
        List<QxRoleUser> roleUserList = new ArrayList<>();
        for (Integer empId : empIds) {
            QxRoleUser roleUser = new QxRoleUser();
            roleUser.setRoleid(roleId);
            roleUser.setEid(empId);
            roleUserList.add(roleUser);
        }

        // 执行批量保存
        boolean result = this.saveBatch(roleUserList);
        logger.info("角色用户关联保存" + (result ? "成功" : "失败"));
        return result;
    }

}
